package com.google.code.sfa.nextgen;

import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
import org.biojava.bio.symbol.Symbol;
import org.biojava.bio.symbol.SymbolList;
import com.google.code.sfa.parse.Trace;

public class Indexes {

    private List<NextGenIndex> _indexes;


    public Indexes() {
	_indexes = new ArrayList<NextGenIndex>();
	_indexes.add( new NextGenIndex( new int[] {1,1,1,1, 1,1,1,1, 1,1,1,1, 0,0,0,0,
						   0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0}));
	_indexes.add( new NextGenIndex( new int[] {0,0,0,0, 0,0,0,0, 0,0,0,0, 1,1,1,1,
						   1,1,1,1, 1,1,1,1, 0,0,0,0, 0,0,0,0}));
	_indexes.add( new NextGenIndex( new int[] {0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
						   0,0,0,0, 1,1,1,1, 1,1,1,1, 1,1,1,1}));
	_indexes.add( new NextGenIndex( new int[] {0,0,0,0, 0,0,0,0, 0,0,0,0, 0,1,1,1,
						   1,1,1,0, 0,0,0,0, 0,1,1,1, 1,1,1,0}));
    }

    public void add( Trace t) {

	for( NextGenIndex index : _indexes) {
	    index.reset( t);
	}
       
	for( int i = 1; i <= 32; i++) {
	    for( NextGenIndex index : _indexes) {
		index.add( t.getSequence().symbolAt(i));
	    }
	}

    }

    public Map<Trace,Integer> findMatches( SymbolList s, int pos) {
	Map<Trace,Integer> matches = new HashMap<Trace,Integer>();
	List<Trace> list;
	
	for( NextGenIndex index : _indexes) {
	    index.reset( null);
	    for( int i = 0; i < 32; i++) {
		index.add( s.symbolAt(i+pos));
	    }

	    list = index.getMatches();
	    if( list != null) {
		for( Trace t : list) {
		    if( matches.containsKey( t) ) {
			matches.put( t, matches.get(t) + 1);
		    } else {
			matches.put( t, 1);
		    }
		}
	    }
	}

	return matches;
    }
}
